﻿using System;
using System.Collections.Generic;
using System.Linq;
using CLM.Gestao.Interfaces;
using CLM.Gestao.Administrador.DAL;

namespace CLM.Gestao.Administrador.BLL
{
    public class Categoria : CategoriaBLO<TB_CATEGORIA>
    {
        private List<TB_CATEGORIA> ConvertToEDM(List<Lista> pLista)
        {
            List<TB_CATEGORIA> List = (from l in pLista
                                       select new TB_CATEGORIA
                                       {
                                           ID_CATEGORIA = l.IdCategoria,
                                           NOME_CATEGORIA = l.NomeCategoria,
                                           CODIGO_CATEGORIA = l.CodigoCategoria
                                       }).ToList();
            return List;
        }

        private List<Lista> ConvertToContext(List<TB_CATEGORIA> pContext)
        {
            List<Lista> List = (from l in pContext
                                select new Lista
                                {
                                    IdCategoria = l.ID_CATEGORIA,
                                    CodigoCategoria = l.CODIGO_CATEGORIA,
                                    NomeCategoria = l.NOME_CATEGORIA

                                }).ToList();
            return List;
        }

        public void Add(List<Lista> pLista)
        {
            try
            {
                foreach (var item in ConvertToEDM(pLista))
                    base.Add(item);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public void Delete(List<Lista> pLista)
        {
            try
            {
                foreach (var item in ConvertToEDM(pLista))
                    base.Delete(item);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public void Update(List<Lista> pLista)
        {
            try
            {
                foreach (var item in ConvertToEDM(pLista))
                    base.Update(item);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public List<Lista> GetLista()
        {
            return GetLista(new Lista());
        }

        public List<Lista> GetLista(Lista pPesquisa)
        {
            var ListaCategoria = (from p in GetAll()
                                  //where p.NOME_Categoria.Contains(pPesquisa == null ? p.NOME_Categoria : pPesquisa.NomeCategoria)
                                  select new Lista()
                                  {
                                      IdCategoria = p.ID_CATEGORIA,
                                      NomeCategoria = p.NOME_CATEGORIA,
                                      CodigoCategoria = p.CODIGO_CATEGORIA

                                  }).ToList();
            return ListaCategoria;
        }

        public List<Itens> GetItens()
        {
            return GetItens(new Itens());
        }

        public List<Itens> GetItens(Itens pPesquisa)
        {
            var ListaCategoria = (from p in GetAll()
                                  //where p.NOME_CATEGORIA.Contains(pPesquisa == null ? p.NOME_CATEGORIA : pPesquisa.NomeCategoria)
                                  select new Itens()
                                  {
                                      IdCategoria = p.ID_CATEGORIA,
                                      NomeCategoria = p.NOME_CATEGORIA,
                                      CodigoCategoria = p.CODIGO_CATEGORIA
                                  }).OrderBy(o => o.NomeCategoria).ToList();
            return ListaCategoria;
        }

        /// <summary>
        /// Preenche o combobox
        /// </summary>
        public class Itens
        {
            public int IdCategoria { get; set; }
            public string CodigoCategoria { get; set; }
            public string NomeCategoria { get; set; }
        }

        /// <summary>
        /// Lista com as propriedades da classe
        /// </summary>
        public class Lista
        {
            public int IdCategoria { get; set; }
            public string CodigoCategoria { get; set; }
            public string NomeCategoria { get; set; }
        }
    }

    public class CategoriaBLO<T> : IBLO<T> where T : TB_CATEGORIA
    {
        /// <summary>
        /// CategoriaDAO
        /// </summary>
        private CategoriaDAO<T> _base = new CategoriaDAO<T>();

        /// <summary>
        /// Adiciona uma entidade no sistema
        /// </summary>
        /// <param name="pEntity">pEntity</param>
        /// <returns>Entidade</returns>
        public T Add(T pEntity)
        {
            Validate(pEntity);
            _base.Add(pEntity);
            return _base.Save(pEntity);
        }

        /// <summary>
        /// Salva uma entidade do sistema
        /// </summary>
        /// <param name="pEntity">pEntity</param>
        /// <returns>Entidade</returns>
        public T Save(T pEntity)
        {
            Validate(pEntity);
            return _base.Save(pEntity);
        }

        /// <summary>
        /// Deleta uma entidade do sistema
        /// </summary>
        /// <param name="pEntity">pEntity</param>
        public void Delete(T pEntity)
        {
            _base.Delete(pEntity);
            _base.Save(pEntity);
        }

        /// <summary>
        /// Atualiza uma entidade do sistema
        /// </summary>
        /// <param name="pEntity">pEntity</param>
        /// <returns>Entidade</returns>
        public T Update(T pEntity)
        {
            Validate(pEntity);
            _base.Update(pEntity);
            return _base.Save(pEntity);
        }

        /// <summary>
        /// Recupera uma entidade do sistema
        /// </summary>
        /// <returns>Lista</returns>
        public IQueryable<T> GetAll()
        {
            return _base.GetAll();
        }

        /// <summary>
        /// Valida a consistência da Entidade antes de 'comitar' a transação
        /// </summary>
        /// <param name="pEntity">Entidade</param>
        public void Validate(T pEntity)
        {

        }
    }
}